/** 
 * Superklasse Medium von dem die Klassen Printmedium, Aufsatz und
 * Datentraeger erben.
 * 
 * Alle Methoden mit setze...() weisen einer Variablen einen Wert zu.
 * Alle gib...() Methoden liefern den Wert der jeweiligen Variablen
 * zurueck. Alle ...Hinzufuegen Methoden fuegen einen Wert einer Liste 
 * hinzu. 
 * 
 * 
 * Datei: Medium.java              Autor: Simon Schindelmann 
 * Datum: 05.11.11                 Version: 0.3
 * 
 * Historie:
 * 05.11.11:  v0.1    Klasse wurde angelegt.
 * 06.12.11   v0.2    gibErscheinungsdatumString () Methode hinzugefuegt
 *                    Gibt das Datum als String zurueck.
 * 25.12.11:  v0.3    gibStichworteString () Methode hinzugefuegt. Gibt
 *                    die Stichworte als String zurueck.
 * 
 */
package medienverwaltung;

import java.io.Serializable;
import java.util.*;
import kommunikation.Notiz;
import personenverwaltung.Benutzer;
import personenverwaltung.Datum;


public class Medium implements Serializable
{

  private static final long serialVersionUID = 6350954120408697025L;
  private int mediumId;
  private Notiz notiz;
  private String thema, sachgebiet, fachgebiet, umfang, ausgabe, titel;
  private HashSet<String> stichworte = new HashSet<String> ();
  private Abmessung abmessung;
  private Datum erscheinungsdatum;
  protected String initial;             /* Kuerzel des Mediums        */
  private Verlag verlag;


  public Medium (String titel, String datum, Abmessung abmessung)
      throws KeinDatumFormat
  {
    mediumId = Nummerngenerator.generiereMediumId ();
    this.titel = titel;
    erscheinungsdatum = DatumParser.stringZuDatum (datum);
    this.abmessung = abmessung;
    initial = "ME";
  }


  public Medium (String titel, String datum, Abmessung abmessung,
      String verlag, String ausgabe) throws KeinDatumFormat
  {
    mediumId = Nummerngenerator.generiereMediumId ();
    this.titel = titel;
    erscheinungsdatum = DatumParser.stringZuDatum (datum);
    this.abmessung = abmessung;
    this.verlag = verlagSetzen (verlag);
    this.ausgabe = ausgabe;
    initial = "ME";
  }


  /**
   * Hier werden ein oder mehrere Stichpunkte uebergeben die durch ein
   * komma getrennt sind. Diese Stichpunkte werden zerlegt so das jedes
   * Stichwort einzeln in einem Array steht. Das Array wird dann durch
   * gegangen und die Stichworte der Stichwort Liste hinzugefuegt.
   * 
   * @param worte Ein oder mehrere Stichworte.
   */
  private void setzeStichworte (String worte)
  {
    String[] temp;
    temp = StichwortParser.parsen (worte);

    for (int i = 0; i < temp.length; i++)
    {
      stichworte.add (temp[i]);
    }
  }


  /**
   * Themengiebt des Mediums wird gesetzt.
   * @param thema Themengiebt.
   */
  public void setzeThema (String thema)
  {
    this.thema = thema;
  }

  
  /**
   * Umfang des Mediums wird gesetzt (z.B. Seitenanzahl)
   * @param umfang Umfang des Mediums
   */
  public void setzeUmfang (String umfang)
  {
    this.umfang = umfang;
  }


  /**
   * Ausgabe des Mediums wird gesetzt (auch Auflage genannt).
   * @param ausgabe Ausgabe des Mediums.
   */
  public void setzeAusgabe (String ausgabe)
  {
    this.ausgabe = ausgabe;
  }

  
  /**
   * Hier wird der Verlag des Mediums angegeben.
   * @param verlag Verlag des Mediums.
   */
  public void setzeVerlag (String verlag)
  {
    this.verlag = verlagSetzen (verlag);
  }

  /**
   * Prueft ob dieser Verlag schon existiert. Wenn ja wird der 
   * existierende Verlag zurueck gegeben andernfalls wird ein neuer 
   * Verlag angelegt.
   * @param verlag Name des Verlags.
   * @return Verlag des Mediums.
   */
  private Verlag verlagSetzen (String verlag)
  {
    Verlagsverwalter vv = new Verlagsverwalter ();
    boolean temp = false;
    
    for (Verlag r : vv.gibVerlagsListe ())
    {
      if (r.gibName ().toLowerCase ().equals (verlag.toLowerCase ()))
      {
        temp = true;
        return r;
      }
    }
    if(temp == false)
    {
      Verlag v = new Verlag (verlag);
      vv.verlagHinzufuegen (v);
      return v;
    }
    return null;
  }

  
  /**
   * Hier wird das Fachgebiet gesetzt.
   * @param fach Fachgebiet des Mediums.
   */
  public void setzeFachgebiet (String fach)
  {
    fachgebiet = fach;
  }

  
  /**
   * Hier wird das Sachgeibet gesetzt.
   * @param sach Sachgebiet des Mediums.
   */
  public void setzeSachgebiet (String sach)
  {
    sachgebiet = sach;
  }
  
  
  /**
   * Hier wird der Titel des Mediums gesetzt.
   * @param titel Titel des Mediums.
   */
  public void setzeTitel (String titel)
  {
    this.titel = titel;
  }
  
  
  /**
   * Hier werden die Abmessungen gesetzt.
   * @param a Abmessung des Mediums.
   */
  public void setzeAbmessungen (Abmessung a)
  {
    abmessung = a;
  }
  
  
  /**
   * Hier wird das Datum des Mediums gesetzt.
   * @param datum Datum als String wird dann durch eine Methode der 
   * Klasse Datum-Parser umgewandet in den Typ Datum.
   * @throws KeinDatumFormat wird geworfen wenn der Parameter nicht dem
   * Datumformat entspricht.
   */
  public void setzeDatum (String datum) throws KeinDatumFormat
  {
    erscheinungsdatum = DatumParser.stringZuDatum (datum);
  }

  
  /**
   * Fuegt den Medium Stichworte hinzu ueber die es spaeter auch 
   * gefunden werden kann. 
   * @param stichworte Stichworte des Mediums.
   */
  public void stichwortHinzufuegen (String stichworte)
  {
    this.stichworte.clear ();
    setzeStichworte (stichworte);
  }


  /**
   * Fuegt den Medium Notizen hinzu.
   * @param inhalt Inhalt der Notiz.
   * @param b Mitarbeiter der diese Notiz gemacht hat.
   */
  public void notizHinzufuegen (String inhalt, Benutzer b)
  {
    if(notiz == null)
    {
      notiz = new Notiz (inhalt, b);
    }
    else
    {
      notiz.notizHinzufuegen (inhalt, b);
    }
 
  }

  
  /**
   * Gibt die Id des Mediums zurueck. 
   * @return MediumId
   */
  public int gibMediumId ()
  {
    return mediumId;
  }

  
  /**
   * Gibt den Titel des Mediums zuruck.
   * @return Titel des Mediums.
   */
  public String gibTitel ()
  {
    return titel;
  }


  /**
   * Gibt die Notizen des Mediums zurueck.
   * @return Notizen des Mediums.
   */
  public Notiz gibNotiz ()
  {
    return notiz;
  }

  
  /**
   * Gibt das Themengebiet des Mediums zurueck.
   * @return Themengebiet des Mediums.
   */
  public String gibThema ()
  {
    return thema;
  }

  
  /**
   * Gibt das Sachgebiet des Mediums zurueck.
   * @return Sachgebiet des Mediums.
   */
  public String gibSachgebiet ()
  {
    return sachgebiet;
  }


  /**
   * Gibt das Fachgebiet des Mediums zurueck.
   * @return Fachgebiet des Mediums.
   */
  public String gibFachgebiet ()
  {
    return fachgebiet;
  }


  /**
   * Gibt die Liste mit den Sichtworten zurueck.
   * @return HashSet Liste mit Sichtworten.
   */
  public HashSet<String> gibStichworte ()
  {
    return stichworte;
  }
  
  /**
   * Gibt die Stichwort Liste als String zurueck.
   * @return String mit den Stichworten.
   */
  public String gibStichworteString ()
  {
    String worte = "";
    int i = stichworte.size ();
    for(String s : stichworte)
    {
      if(i > 1)
      {
        worte = worte + " " + s + ", ";
      }
      else
      {
        worte = worte + " " + s;
      }
      i--;
    }
    return worte;
  }

  
  /**
   * Gibt die Abmessungen des Meidums zurueck. 
   * @return Abmessung des Mediums.
   */
  public Abmessung gibAbmessung ()
  {
    return abmessung;
  }


  /**
   * Gibt das Erscheinungsdatum des Mediums zurueck.
   * @return Erscheinungsdatum des Mediums.
   */
  public Datum gibErscheinungsdatum ()
  {
    return erscheinungsdatum;
  }
  
  /**
   * Gibt das Erscheinungsdatum als String zurueck.
   * @return Erschungsdatum als String.
   */
  public String gibErscheinungsdatumString ()
  {
    int jahr, monat, tag;
    String datum;
    jahr = erscheinungsdatum.gibJahr ();
    monat = erscheinungsdatum.gibMonat ();
    tag = erscheinungsdatum.gibTag ();
    datum = "" + tag + "." + monat + "." + jahr; 
    return datum;
  }


  /**
   * Gibt den Umfang des Mediums zurueck.
   * @return Umfang des Mediums.
   */
  public String gibUmfang ()
  {
    return umfang;
  }

  
  /**
   * Gibt die Ausgabe des Mediums zurueck. 
   * @return Ausgabe dese Mediums.
   */
  public String gibAusgabe ()
  {
    return ausgabe;
  }

  
  /**
   * Gibt den Verlag des Mediums zurueck.
   * @return Verlag des Mediums.
   */
  public Verlag gibVerlag ()
  {
    return verlag;
  }


  /**
   * Gibt das Initial dese Mediums zurueck.
   * @return Initial des Mediums.
   */
  public String gibInitial ()
  {
    return initial;
  }
}
